home *** CD-ROM | disk | FTP | other *** search
Text File | 1999-01-14 | 50.0 KB | 2,078 lines | [TEXT/CWIE] |
- ///--------------------------------------------------------------------------------------
- // BlitPixieAllBit.c
- //
- // By Christofer Åkersten (chris@basesoft.se)
- //
- // Ideas and code snippets from
- // Tony Myles, Ben Sharpe, Brigham Stevens, Sean Callahan, and Joe Britt
- //
- // Description: Implementation of a depth-independent BlitPixie
- //
- //
- // Simple PPC Version by Brian Roddy. Note PPC version only deals properly with 8-bit
- // color or higher. Lower bit depths will work but will be misaligned. This is because
- // lower depth blitters require a bunch of bit shifting and aligning which I'm too
- // lazy to write. Besides, PPC handles 8-bit fast enough that you probably won't
- // need to use less than 256 colors.
- //
- // Anders Björklund cleaned up the mess that Brian left :-)
- // It has the same limits as above, though.
- //
- ///--------------------------------------------------------------------------------------
-
-
- #ifndef __BLITPIXIE__
- #include "BlitPixie.h"
- #endif
-
- #ifndef __SWCOMMON__
- #include "SWCommonHeaders.h"
- #endif
-
- #ifndef __SPRITEWORLDUTILS__
- #include "SpriteWorldUtils.h"
- #endif
-
- #ifndef __TOOLUTILS__
- #include <ToolUtils.h>
- #endif
-
- #ifndef __OSUTILS__
- #include <OSUtils.h>
- #endif
-
- #ifndef __QUICKDRAW__
- #include <Quickdraw.h>
- #endif
-
- #ifndef __QDOFFSCREEN__
- #include <QDOffscreen.h>
- #endif
-
- #ifndef __SPRITEFRAME__
- #include "SpriteFrame.h"
- #endif
-
-
- const short bpla[] = {
- 5,
- 4,
- 0, 3,
- 0, 0, 0, 2,
- 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-
- //BITSHIFT PER LONGWORD
- #define BPL(f1, f2, b1, b2) \
- { \
- int pixelSize = (*f1->framePort->portPixMap)->pixelSize; \
- if (pixelSize != (*f2->framePort->portPixMap)->pixelSize) \
- return; \
- b1 = bpla[pixelSize - 1]; \
- b2 = 5 - b1; \
- }
-
- // i.e:
- // Depth=1 b1=5 b2=0 (32 pixels per long, 1 bit per pixel)
- // Depth=2 b1=4 b2=1 (16 pixels per long, 2 bits per pixel)
- // Depth=4 b1=3 b2=2 (8 pixels per long, 4 bits per pixel)
- // Depth=8 b1=2 b2=3 (4 pixels per long, 8 bits per pixel)
- // Depth=16 b1=1 b2=4 (2 pixels per long, 16 bits per pixel)
- // Depth=32 b1=0 b2=5 (1 pixel per long, 32 bits per pixel)
-
- // generic all-bit routine:
- //void BlitPixieAllBit(
- // PixelPtr srcPixelP, start of first pixel (aligned left to longword boundary)
- // PixelPtr dstPixelP,
- // long rowsToCopy, number of rows
- // long numBytesPerRow, number of bytes per row, always a multiple of four
- // unsigned long srcRowStride, offset from end of line to next row / rowbytes on PPC
- // unsigned long dstRowStride,
- // unsigned long srcExtraStart, bits to copy/shift before longs (maximum 31 bits)
- // unsigned long dstExtraStart,
- // unsigned long dstExtraEnd); bits to copy/shift after longs
-
-
-
- extern SInt8 gSWmmuMode;
-
-
- ///--------------------------------------------------------------------------------------
- // BlitPixieRectDrawProc
- ///--------------------------------------------------------------------------------------
- SW_FUNC void BlitPixieAllBitRectDrawProc(
- FramePtr srcFrameP,
- FramePtr dstFrameP,
- Rect* srcRect,
- Rect* dstRect)
- {
- Rect srcBlitRect = *srcRect;
- Rect dstBlitRect = *dstRect;
- unsigned long numBytesPerRow;
- short b1, b2;
-
- SW_ASSERT(srcFrameP->isFrameLocked && dstFrameP->isFrameLocked);
-
- BP_CLIP_RECT(dstFrameP->frameRect, srcBlitRect, dstBlitRect);
- BPL(srcFrameP, dstFrameP, b1, b2);
- START_32_BIT_MODE
-
- numBytesPerRow =
- ((dstBlitRect.right - dstBlitRect.left) >> b1) * sizeof(long);
-
- BlitPixieAllBit(
- (PixelChunkPtr)(srcFrameP->frameBaseAddr +
- (srcFrameP->scanLinePtrArray[srcBlitRect.top - srcFrameP->frameRect.top]) +
- ((srcBlitRect.left >> b1) * sizeof(long))),
- (PixelChunkPtr)(dstFrameP->frameBaseAddr +
- (dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
- ((dstBlitRect.left >> b1) * sizeof(long))),
- dstBlitRect.bottom - dstBlitRect.top,
- numBytesPerRow,
- #if SW_PPC
- srcFrameP->frameRowBytes,
- dstFrameP->frameRowBytes,
- #else
- srcFrameP->frameRowBytes - numBytesPerRow,
- dstFrameP->frameRowBytes - numBytesPerRow,
- #endif
- (srcBlitRect.left << b2) & 0x1F,
- ((dstFrameP->worldRectOffset << b2) & 0x1F) + ((dstBlitRect.left << b2) & 0x1F),
- ((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F
- );
-
- END_32_BIT_MODE
- }
-
- ///--------------------------------------------------------------------------------------
- // BPAllBitInterlacedRectDrawProc
- ///--------------------------------------------------------------------------------------
- SW_FUNC void BPAllBitInterlacedRectDrawProc(
- FramePtr srcFrameP,
- FramePtr dstFrameP,
- Rect* srcRect,
- Rect* dstRect)
- {
- Rect srcBlitRect = *srcRect;
- Rect dstBlitRect = *dstRect;
- unsigned long numBytesPerRow;
- unsigned long numRowsToCopy;
- short b1, b2;
-
- SW_ASSERT(srcFrameP->isFrameLocked && dstFrameP->isFrameLocked);
-
- BP_CLIP_RECT_INTERLACED(dstFrameP->frameRect, srcBlitRect, dstBlitRect);
- BPL(srcFrameP, dstFrameP, b1, b2);
- // Is destBlitRect height an even number?
- numRowsToCopy = dstBlitRect.bottom - dstBlitRect.top;
- numRowsToCopy = (numRowsToCopy >> 1) + (numRowsToCopy & 1);
- if (numRowsToCopy < 1)
- return;
-
- START_32_BIT_MODE
-
- numBytesPerRow =
- ((dstBlitRect.right - dstBlitRect.left) >> b1) * sizeof(long);
- BlitPixieAllBit(
- (PixelChunkPtr)(srcFrameP->frameBaseAddr +
- (srcFrameP->scanLinePtrArray[srcBlitRect.top - srcFrameP->frameRect.top]) +
- ((srcBlitRect.left >> b1) * sizeof(long))),
- (PixelChunkPtr)(dstFrameP->frameBaseAddr +
- (dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
- ((dstBlitRect.left >> b1) * sizeof(long))),
- numRowsToCopy,
- numBytesPerRow,
- #if SW_PPC
- (srcFrameP->frameRowBytes << 1),
- (dstFrameP->frameRowBytes << 1),
- #else
- (srcFrameP->frameRowBytes << 1) - numBytesPerRow,
- (dstFrameP->frameRowBytes << 1) - numBytesPerRow,
- #endif
- (srcBlitRect.left << b2) & 0x1F,
- ((dstFrameP->worldRectOffset << b2) & 0x1F) + ((dstBlitRect.left << b2) & 0x1F),
- ((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F
- );
-
- END_32_BIT_MODE
- }
-
- ///--------------------------------------------------------------------------------------
- // BlitPixieAllBitMaskDrawProc
- ///--------------------------------------------------------------------------------------
- SW_FUNC void BlitPixieAllBitMaskDrawProc(
- FramePtr srcFrameP,
- FramePtr dstFrameP,
- Rect *srcRect,
- Rect *dstRect)
- {
- Rect dstBlitRect = *dstRect;
- Rect srcBlitRect = *srcRect;
- unsigned long numBytesPerRow;
- unsigned long srcBaseOffset;
- short b1, b2;
-
- SW_ASSERT(srcFrameP->isFrameLocked && dstFrameP->isFrameLocked);
- SW_ASSERT(srcFrameP->maskPort != NULL);
-
- BP_CLIP_RECT(dstFrameP->frameRect, srcBlitRect, dstBlitRect);
- BPL(srcFrameP, dstFrameP, b1, b2);
- START_32_BIT_MODE
-
- srcBaseOffset =
- (srcFrameP->scanLinePtrArray[srcBlitRect.top - srcFrameP->frameRect.top]) +
- ((srcBlitRect.left >> b1) * sizeof(long));
- numBytesPerRow =
- ((dstBlitRect.right - dstBlitRect.left) >> b1) * sizeof(long);
-
- if ( (*srcFrameP->framePort->portPixMap)->pixelSize < 16 )
- {
- BlitPixieAllBitMask(
- (PixelChunkPtr)(srcFrameP->frameBaseAddr +
- srcBaseOffset),
- (PixelChunkPtr)(dstFrameP->frameBaseAddr +
- (dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
- ((dstBlitRect.left >> b1) * sizeof(long))),
- (PixelChunkPtr)(srcFrameP->maskBaseAddr +
- srcBaseOffset),
- dstBlitRect.bottom - dstBlitRect.top,
- numBytesPerRow,
- #if SW_PPC
- srcFrameP->frameRowBytes,
- dstFrameP->frameRowBytes,
- #else
- srcFrameP->frameRowBytes - numBytesPerRow,
- dstFrameP->frameRowBytes - numBytesPerRow,
- #endif
- (srcBlitRect.left << b2) & 0x1F,
- (((dstFrameP->worldRectOffset + dstBlitRect.left) << b2) & 0x1F),
- ((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F
- );
- }
- else
- {
- BlitPixieAllBitPartialMask(
- (PixelChunkPtr)(srcFrameP->frameBaseAddr +
- srcBaseOffset),
- (PixelChunkPtr)(dstFrameP->frameBaseAddr +
- (dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
- ((dstBlitRect.left >> b1) * sizeof(long))),
- (PixelChunkPtr)(srcFrameP->maskBaseAddr +
- srcBaseOffset),
- dstBlitRect.bottom - dstBlitRect.top,
- numBytesPerRow,
- #if SW_PPC
- srcFrameP->frameRowBytes,
- dstFrameP->frameRowBytes,
- #else
- srcFrameP->frameRowBytes - numBytesPerRow,
- dstFrameP->frameRowBytes - numBytesPerRow,
- #endif
- (srcBlitRect.left << b2) & 0x1F,
- (((dstFrameP->worldRectOffset + dstBlitRect.left) << b2) & 0x1F),
- ((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F
- );
- }
-
- END_32_BIT_MODE
- }
-
- ///--------------------------------------------------------------------------------------
- // BlitPixieAllBitPartialMaskDrawProc
- ///--------------------------------------------------------------------------------------
- SW_FUNC void BlitPixieAllBitPartialMaskDrawProc(
- FramePtr srcFrameP,
- FramePtr dstFrameP,
- Rect *srcRect,
- Rect *dstRect)
- {
- Rect dstBlitRect = *dstRect;
- Rect srcBlitRect = *srcRect;
- unsigned long numBytesPerRow;
- unsigned long srcBaseOffset;
- short b1, b2;
-
- SW_ASSERT(srcFrameP->isFrameLocked && dstFrameP->isFrameLocked);
- SW_ASSERT(srcFrameP->maskPort != NULL);
-
- BP_CLIP_RECT(dstFrameP->frameRect, srcBlitRect, dstBlitRect);
- BPL(srcFrameP, dstFrameP, b1, b2);
- START_32_BIT_MODE
-
- srcBaseOffset =
- (srcFrameP->scanLinePtrArray[srcBlitRect.top - srcFrameP->frameRect.top]) +
- ((srcBlitRect.left >> b1) * sizeof(long));
- numBytesPerRow =
- ((dstBlitRect.right - dstBlitRect.left) >> b1) * sizeof(long);
- BlitPixieAllBitPartialMask(
- (PixelChunkPtr)(srcFrameP->frameBaseAddr +
- srcBaseOffset),
- (PixelChunkPtr)(dstFrameP->frameBaseAddr +
- (dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
- ((dstBlitRect.left >> b1) * sizeof(long))),
- (PixelChunkPtr)(srcFrameP->maskBaseAddr +
- srcBaseOffset),
- dstBlitRect.bottom - dstBlitRect.top,
- numBytesPerRow,
- #if SW_PPC
- srcFrameP->frameRowBytes,
- dstFrameP->frameRowBytes,
- #else
- srcFrameP->frameRowBytes - numBytesPerRow,
- dstFrameP->frameRowBytes - numBytesPerRow,
- #endif
- (srcBlitRect.left << b2) & 0x1F,
- (((dstFrameP->worldRectOffset + dstBlitRect.left) << b2) & 0x1F),
- ((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F
- );
-
- END_32_BIT_MODE
- }
-
- ///--------------------------------------------------------------------------------------
- // BPAllBitInterlacedMaskDrawProc
- ///--------------------------------------------------------------------------------------
- SW_FUNC void BPAllBitInterlacedMaskDrawProc(
- FramePtr srcFrameP,
- FramePtr dstFrameP,
- Rect* srcRect,
- Rect* dstRect)
- {
- Rect srcBlitRect = *srcRect;
- Rect dstBlitRect = *dstRect;
- unsigned long numBytesPerRow;
- unsigned long numRowsToCopy;
- unsigned long srcBaseOffset;
- short b1, b2;
-
- SW_ASSERT(srcFrameP->isFrameLocked && dstFrameP->isFrameLocked);
- SW_ASSERT(srcFrameP->maskPort != NULL);
-
- BP_CLIP_RECT_INTERLACED(dstFrameP->frameRect, srcBlitRect, dstBlitRect);
- BPL(srcFrameP, dstFrameP, b1, b2);
- // Is destBlitRect height an even number?
- numRowsToCopy = dstBlitRect.bottom - dstBlitRect.top;
- numRowsToCopy = (numRowsToCopy >> 1) + (numRowsToCopy & 1);
- if (numRowsToCopy < 1)
- return;
- START_32_BIT_MODE
-
- srcBaseOffset =
- (srcFrameP->scanLinePtrArray[srcBlitRect.top - srcFrameP->frameRect.top]) +
- ((srcBlitRect.left >> b1) * sizeof(long));
- numBytesPerRow =
- ((dstBlitRect.right - dstBlitRect.left) >> b1) * sizeof(long);
-
- if ( (*srcFrameP->framePort->portPixMap)->pixelSize < 16 )
- {
- BlitPixieAllBitMask(
- (PixelChunkPtr)(srcFrameP->frameBaseAddr +
- srcBaseOffset),
- (PixelChunkPtr)(dstFrameP->frameBaseAddr +
- (dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
- ((dstBlitRect.left >> b1) * sizeof(long))),
- (PixelChunkPtr)(srcFrameP->maskBaseAddr +
- srcBaseOffset),
- numRowsToCopy,
- numBytesPerRow,
- #if SW_PPC
- (srcFrameP->frameRowBytes << 1),
- (dstFrameP->frameRowBytes << 1),
- #else
- (srcFrameP->frameRowBytes << 1) - numBytesPerRow,
- (dstFrameP->frameRowBytes << 1) - numBytesPerRow,
- #endif
- (srcBlitRect.left << b2) & 0x1F,
- (((dstFrameP->worldRectOffset + dstBlitRect.left) << b2) & 0x1F),
- ((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F
- );
- }
- else
- {
- BlitPixieAllBitPartialMask(
- (PixelChunkPtr)(srcFrameP->frameBaseAddr +
- srcBaseOffset),
- (PixelChunkPtr)(dstFrameP->frameBaseAddr +
- (dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
- ((dstBlitRect.left >> b1) * sizeof(long))),
- (PixelChunkPtr)(srcFrameP->maskBaseAddr +
- srcBaseOffset),
- numRowsToCopy,
- numBytesPerRow,
- #if SW_PPC
- (srcFrameP->frameRowBytes << 1),
- (dstFrameP->frameRowBytes << 1),
- #else
- (srcFrameP->frameRowBytes << 1) - numBytesPerRow,
- (dstFrameP->frameRowBytes << 1) - numBytesPerRow,
- #endif
- (srcBlitRect.left << b2) & 0x1F,
- (((dstFrameP->worldRectOffset + dstBlitRect.left) << b2) & 0x1F),
- ((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F
- );
- }
-
- END_32_BIT_MODE
- }
-
- ///--------------------------------------------------------------------------------------
- // BPAllBitInterlacedPartialMaskDrawProc
- ///--------------------------------------------------------------------------------------
- SW_FUNC void BPAllBitInterlacedPartialMaskDrawProc(
- FramePtr srcFrameP,
- FramePtr dstFrameP,
- Rect* srcRect,
- Rect* dstRect)
- {
- Rect srcBlitRect = *srcRect;
- Rect dstBlitRect = *dstRect;
- unsigned long numBytesPerRow;
- unsigned long numRowsToCopy;
- unsigned long srcBaseOffset;
- short b1, b2;
-
- SW_ASSERT(srcFrameP->isFrameLocked && dstFrameP->isFrameLocked);
- SW_ASSERT(srcFrameP->maskPort != NULL);
-
- BP_CLIP_RECT_INTERLACED(dstFrameP->frameRect, srcBlitRect, dstBlitRect);
- BPL(srcFrameP, dstFrameP, b1, b2);
- // Is destBlitRect height an even number?
- numRowsToCopy = dstBlitRect.bottom - dstBlitRect.top;
- numRowsToCopy = (numRowsToCopy >> 1) + (numRowsToCopy & 1);
- if (numRowsToCopy < 1)
- return;
- START_32_BIT_MODE
-
- srcBaseOffset =
- (srcFrameP->scanLinePtrArray[srcBlitRect.top - srcFrameP->frameRect.top]) +
- ((srcBlitRect.left >> b1) * sizeof(long));
- numBytesPerRow =
- ((dstBlitRect.right - dstBlitRect.left) >> b1) * sizeof(long);
- BlitPixieAllBitPartialMask(
- (PixelChunkPtr)(srcFrameP->frameBaseAddr +
- srcBaseOffset),
- (PixelChunkPtr)(dstFrameP->frameBaseAddr +
- (dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
- ((dstBlitRect.left >> b1) * sizeof(long))),
- (PixelChunkPtr)(srcFrameP->maskBaseAddr +
- srcBaseOffset),
- numRowsToCopy,
- numBytesPerRow,
- #if SW_PPC
- (srcFrameP->frameRowBytes << 1),
- (dstFrameP->frameRowBytes << 1),
- #else
- (srcFrameP->frameRowBytes << 1) - numBytesPerRow,
- (dstFrameP->frameRowBytes << 1) - numBytesPerRow,
- #endif
- (srcBlitRect.left << b2) & 0x1F,
- (((dstFrameP->worldRectOffset + dstBlitRect.left) << b2) & 0x1F),
- ((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F
- );
- END_32_BIT_MODE
- }
-
- #pragma mark -
-
- #pragma mark *** PowerPC:
- #if SW_PPC
-
-
- // Power PC Blitters
- // Note we do no bit aligniment, so we only handle 8-bit or higher color.
- // Lower color will work but will misalign copying of the sprites.
- // To write one that works, you need to use the srcExtraStart and dstExtraStart
- // to figure out how many bits you need to shift the source and the destination
- // before you copy the bits. Then use dstExtraEnd to figure out how many extra
- // bits you need to copy at the end.
-
- ///--------------------------------------------------------------------------------------
- // BlitPixieAllBit
- ///--------------------------------------------------------------------------------------
- // Since this blit routine just does straight copying and requires no boolean operations,
- // we can make use of the floating point registers on the Power PC. This means we
- // can blit a double, 8 bytes at a time, rather than a long. This makes the blitter
- // faster. We could speed this up even more by unrolling the loop for big blits,
- // but it would make the code much less readable.
- // Unfortunately, this function reqires that the src and dest pointers be 4-byte
- // aligned for doubles to be used or else alignment has to be done in hardware on the
- // PPC601 (still faster) or in software (argh) on the PPC604 which will probably be
- // slower though I haven't tested it yet.
-
- void BlitPixieAllBit(
- register PixelPtr srcPixelPTemp,
- register PixelPtr dstPixelPTemp,
- unsigned long rowsToCopy,
- unsigned long numBytesPerRow,
- register unsigned long srcOffset,
- register unsigned long dstOffset,
- register unsigned long srcExtraStart,
- register unsigned long dstExtraStart,
- register unsigned long dstExtraEnd)
- {
- if ((srcExtraStart & 16) != 0)
- ((unsigned short *) srcPixelPTemp)++;
- if ((srcExtraStart & 8) != 0)
- ((unsigned char *) srcPixelPTemp)++;
-
- if ((dstExtraStart & 8) != 0)
- ((unsigned char *) dstPixelPTemp)++;
- if ((dstExtraStart & 16) != 0)
- ((unsigned short *) dstPixelPTemp)++;
-
- if (((unsigned long)srcPixelPTemp & 3) || ((unsigned long)dstPixelPTemp & 3)) {
- register long index;
- register PixelChunkPtr srcPixelP = srcPixelPTemp;
- register PixelChunkPtr dstPixelP = dstPixelPTemp;
- register PixelChunkPtr startSrcPixelP;
- register PixelChunkPtr startDstPixelP;
-
- startSrcPixelP = srcPixelP;
- startDstPixelP = dstPixelP;
-
- while (rowsToCopy--)
- {
- register int fourblits = (numBytesPerRow >> 2);
-
- srcPixelP = startSrcPixelP;
- dstPixelP = startDstPixelP;
-
- for (index = 0; index < fourblits; index++)
- {
- register unsigned long temp1;
-
- temp1 = srcPixelP[index];
- dstPixelP[index] = temp1;
- }
- srcPixelP += fourblits;
- dstPixelP += fourblits;
-
- if ((dstExtraEnd & 16) != 0)
- *((unsigned short *) dstPixelP)++ = *((unsigned short *) srcPixelP)++;
- if ((dstExtraEnd & 8) != 0)
- *((unsigned char *)dstPixelP)++ = *((unsigned char *)srcPixelP)++;
-
- // bump to next row
- (char *)startSrcPixelP += srcOffset;
- (char *)startDstPixelP += dstOffset;
- }
- } else {
- register long index;
- register double *startSrcPixelP;
- register double *startDstPixelP;
- register double *srcPixelP = (double *)srcPixelPTemp;
- register double *dstPixelP = (double *)dstPixelPTemp;
-
- startSrcPixelP = srcPixelP;
- startDstPixelP = dstPixelP;
-
- while (rowsToCopy--)
- {
- register int eightblits = (numBytesPerRow >> 3);
-
- srcPixelP = startSrcPixelP;
- dstPixelP = startDstPixelP;
-
- for (index = 0; index < eightblits; index++)
- {
- dstPixelP[index] = srcPixelP[index];
- }
- srcPixelP += eightblits;
- dstPixelP += eightblits;
- if (numBytesPerRow & 0x4)
- *((unsigned long *) dstPixelP)++ = *((unsigned long *) srcPixelP)++;
-
- if ((dstExtraEnd & 16) != 0)
- *((unsigned short *) dstPixelP)++ = *((unsigned short *) srcPixelP)++;
- if ((dstExtraEnd & 8) != 0)
- *((unsigned char *)dstPixelP)++ = *((unsigned char *)srcPixelP)++;
-
- // bump to next row
- (char *)startSrcPixelP += srcOffset;
- (char *)startDstPixelP += dstOffset;
- }
- }
- }
-
-
-
- ///--------------------------------------------------------------------------------------
- // BlitPixieAllBitMask
- ///--------------------------------------------------------------------------------------
- void BlitPixieAllBitMask(
- register PixelPtr srcPixelP,
- register PixelPtr dstPixelP,
- register PixelPtr maskPixelP,
- unsigned long rowsToCopy,
- unsigned long numBytesPerRow,
- register unsigned long srcRowStride,
- register unsigned long dstRowStride,
- register unsigned long srcExtraStart,
- register unsigned long dstExtraStart,
- register unsigned long dstExtraEnd)
- {
- long index;
- PixelPtr startSrcPixelP = srcPixelP;
- PixelPtr startDstPixelP = dstPixelP;
- PixelPtr startMaskPixelP = maskPixelP;
-
- if ((srcExtraStart & 16) != 0)
- {
- ((unsigned short *) startSrcPixelP)++;
- ((unsigned short *) startMaskPixelP)++;
- }
- if ((srcExtraStart & 8) != 0)
- {
- ((unsigned char *) startSrcPixelP)++;
- ((unsigned char *) startMaskPixelP)++;
- }
-
- if ((dstExtraStart & 8) != 0)
- ((unsigned char *) startDstPixelP)++;
- if ((dstExtraStart & 16) != 0)
- ((unsigned short *) startDstPixelP)++;
-
- while (rowsToCopy--)
- {
- register fourblits = (numBytesPerRow >> 2);
-
- srcPixelP = startSrcPixelP;
- dstPixelP = startDstPixelP;
- maskPixelP = startMaskPixelP;
-
- for (index = 0; index < fourblits; index++)
- {
- dstPixelP[index] = dstPixelP[index] & maskPixelP[index] | srcPixelP[index];
- }
- srcPixelP += fourblits;
- dstPixelP += fourblits;
- maskPixelP += fourblits;
-
- if ((dstExtraEnd & 16) != 0)
- {
- register unsigned short temp1;
-
- temp1 = (*((unsigned short *) dstPixelP)) & (*((unsigned short *) maskPixelP)++) |
- *((unsigned short *) srcPixelP)++;
-
- (*((unsigned short *) dstPixelP)++) = temp1;
- }
- if ((dstExtraEnd & 8) != 0)
- {
- register unsigned char temp1;
-
- temp1 = (*((unsigned char *) dstPixelP)) & (*((unsigned char *) maskPixelP)++) |
- *((unsigned char *) srcPixelP)++;
-
- (*((unsigned char *) dstPixelP)++) = temp1;
- }
-
- // bump to next row
- startSrcPixelP = (PixelPtr)(((char*)startSrcPixelP) + srcRowStride);
- startDstPixelP = (PixelPtr)(((char*)startDstPixelP) + dstRowStride);
- startMaskPixelP = (PixelPtr)(((char*)startMaskPixelP) + srcRowStride);
- }
- }
-
- ///--------------------------------------------------------------------------------------
- // BlitPixieAllBitPartialMask
- ///--------------------------------------------------------------------------------------
- void BlitPixieAllBitPartialMask(
- register PixelPtr srcPixelP,
- register PixelPtr dstPixelP,
- register PixelPtr maskPixelP,
- unsigned long rowsToCopy,
- unsigned long numBytesPerRow,
- register unsigned long srcRowStride,
- register unsigned long dstRowStride,
- register unsigned long srcExtraStart,
- register unsigned long dstExtraStart,
- register unsigned long dstExtraEnd)
- {
- long index;
- PixelPtr startSrcPixelP = srcPixelP;
- PixelPtr startDstPixelP = dstPixelP;
- PixelPtr startMaskPixelP = maskPixelP;
-
- if ((srcExtraStart & 16) != 0)
- {
- ((unsigned short *) startSrcPixelP)++;
- ((unsigned short *) startMaskPixelP)++;
- }
- if ((srcExtraStart & 8) != 0)
- {
- ((unsigned char *) startSrcPixelP)++;
- ((unsigned char *) startMaskPixelP)++;
- }
-
- if ((dstExtraStart & 8) != 0)
- ((unsigned char *) startDstPixelP)++;
- if ((dstExtraStart & 16) != 0)
- ((unsigned short *) startDstPixelP)++;
-
- while (rowsToCopy--)
- {
- register fourblits = (numBytesPerRow >> 2);
-
- srcPixelP = startSrcPixelP;
- dstPixelP = startDstPixelP;
- maskPixelP = startMaskPixelP;
-
- for (index = 0; index < fourblits; index++)
- {
- dstPixelP[index] = dstPixelP[index] & maskPixelP[index] |
- ( (~maskPixelP[index] )& srcPixelP[index]);
- }
- srcPixelP += fourblits;
- dstPixelP += fourblits;
- maskPixelP += fourblits;
-
- if ((dstExtraEnd & 16) != 0)
- {
- register unsigned short temp1;
-
- temp1 = (*((unsigned short *) dstPixelP)) & (*((unsigned short *) maskPixelP)) |
- (~(*((unsigned short *) maskPixelP)++) &
- *((unsigned short *) srcPixelP)++);
-
- (*((unsigned short *) dstPixelP)++) = temp1;
- }
- if ((dstExtraEnd & 8) != 0)
- {
- register unsigned char temp1;
-
- temp1 = (*((unsigned char *) dstPixelP)) & (*((unsigned char *) maskPixelP)) |
- (~(*((unsigned char *) maskPixelP)++) &
- *((unsigned char *) srcPixelP)++);
-
- (*((unsigned char *) dstPixelP)++) = temp1;
- }
-
- // bump to next row
- startSrcPixelP = (PixelPtr)(((char*)startSrcPixelP) + srcRowStride);
- startDstPixelP = (PixelPtr)(((char*)startDstPixelP) + dstRowStride);
- startMaskPixelP = (PixelPtr)(((char*)startMaskPixelP) + srcRowStride);
- }
- }
-
- #pragma mark *** 680X0:
- #else /* #if SW_PPC */
-
- #if !__MWERKS__
- #define Num(x) #(x)
- #else
- #define Num(x) %(x)
- #endif
-
- #define srcExtraStartTemp srcExtraStart
- #define dstExtraStartTemp dstExtraStart
- #define dstExtraEndTemp dstExtraEnd
- #define dstRowStrideTemp dstRowStride
-
- #define UNROLL(start, end) \
- move.l d1, d0; \
- lsr.l Num(4), d1; \
- moveq Num(0x0F), d2; \
- and.l d2, d0; \
- \
- lea end, a0; \
- lea start, a1; \
- sub.l a0, a1; \
- move.l a1, d2; \
- asr.l Num(4), d2; \
- mulu.l d2, d0; \
- add.l d0, a0;
-
- #define REPEAT(instr) \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr; \
- instr;
-
- ///--------------------------------------------------------------------------------------
- // BlitPixieAllBit
- ///--------------------------------------------------------------------------------------
- SW_ASM_FUNC void BlitPixieAllBit(
- register PixelPtr srcPixelP,
- register PixelPtr dstPixelP,
- unsigned long rowsToCopy,
- unsigned long numBytesPerRow,
- register unsigned long srcRowStride,
- register unsigned long dstRowStride,
- register unsigned long srcExtraStart,
- register unsigned long dstExtraStart,
- register unsigned long dstExtraEnd)
- {
- SW_ASM_BEGIN
-
- #if __MWERKS__
- fralloc +
- #endif
-
- move.l numBytesPerRow, d1
- lsr.l Num(2), d1
- beq @VeryNarrow
-
- tst.l srcExtraStart
- bne @SrcExtraStart
-
- tst.l dstExtraStart
- bne @DstExtraStart
-
- @NoExtraStart:
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @DstExtraStart:
- move.l dstExtraStart, d0
- and.l Num(0x07), d0
- beq @ADstExtraStart
-
- tst.l dstExtraEnd
- beq @EvenOdd
- bra @EvenOddExtra
-
- @ADstExtraStart:
- move.l dstExtraStart, d0
- lsr.l Num(3), d0
- add.l d0, dstPixelP
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @SrcExtraStart:
- tst.l dstExtraStart
- bne @SrcDstExtraStart
- @NoDstExtraStart:
- move.l srcExtraStart, d0
- and.l Num(0x07), d0
- beq @ASrcExtraStart
-
- tst.l dstExtraEnd
- beq @OddEven
- bra @OddEvenExtra
-
- @ASrcExtraStart:
- move.l srcExtraStart, d0
- lsr.l Num(3), d0
- add.l d0, srcPixelP
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @SrcDstExtraStart:
- move.l srcExtraStart, d0
- and.l Num(0x07), d0
- beq @ASrcDstExtraStart
- move.l dstExtraStart, d0
- and.l Num(0x07), d0
- beq @ADstSrcExtraStart
-
- tst.l dstExtraEnd
- beq @OddOdd
- bra @OddOddExtra
-
- @ASrcDstExtraStart:
- move.l dstExtraStart, d0
- and.l Num(0x07), d0
- beq @AASrcDstExtraStart
-
- move.l srcExtraStart, d0
- lsr.l Num(3), d0
- add.l d0, srcPixelP
- tst.l dstExtraEnd
- beq @EvenOdd
- bra @EvenOddExtra
-
- @ADstSrcExtraStart:
- move.l dstExtraStart, d0
- lsr.l Num(3), d0
- add.l d0, dstPixelP
- tst.l dstExtraEnd
- beq @OddEven
- bra @OddEvenExtra
-
- @AASrcDstExtraStart:
- move.l srcExtraStart, d0
- lsr.l Num(3), d0
- add.l d0, srcPixelP
- move.l dstExtraStart, d0
- lsr.l Num(3), d0
- add.l d0, dstPixelP
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @EvenEven:
- // START Even -> Even
- UNROLL(@EE_ColLoop, @EE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EE_ColLoop:
- // BLIT
- #define BLIT \
- move.l (srcPixelP)+, (dstPixelP)+;
- REPEAT(BLIT)
- #undef BLIT
- @EE_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @EE_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
-
- subq.l Num(1), d2
- bgt @EE_RowLoop
- // STOP
- bra @Done
- @EvenEvenExtra:
- // START Even -> Even + Extra
- UNROLL(@EEE_ColLoop, @EEE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EEE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EEE_ColLoop:
- // BLIT
- #define BLIT \
- move.l (srcPixelP)+, (dstPixelP)+;
- REPEAT(BLIT)
- #undef BLIT
- @EEE_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @EEE_ColLoop
- // BLIT EXTRA
- bfextu (srcPixelP){0:dstExtraEnd}, d0
- bfins d0, (dstPixelP){0:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
-
- subq.l Num(1), d2
- bgt @EEE_RowLoop
- // STOP
- bra @Done
-
- @EvenOdd:
- // START Even -> Odd
- UNROLL(@EO_ColLoop, @EO_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EO_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EO_ColLoop:
- // BLIT
- #define BLIT \
- move.l (srcPixelP)+, srcExtraStartTemp; \
- bfins srcExtraStartTemp, (dstPixelP){dstExtraStart:0}; \
- addq.l Num(4), dstPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @EO_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @EO_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
-
- subq.l Num(1), d2
- bgt @EO_RowLoop
- // STOP
- bra @Done
- @EvenOddExtra:
- // START Even -> Odd + Extra
- UNROLL(@EOE_ColLoop, @EOE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EOE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EOE_ColLoop:
- // BLIT
- #define BLIT \
- move.l (srcPixelP)+, srcExtraStartTemp; \
- bfins srcExtraStartTemp, (dstPixelP){dstExtraStart:0}; \
- addq.l Num(4), dstPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @EOE_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @EOE_ColLoop
- //BLIT EXTRA
- bfextu (srcPixelP){0:dstExtraEnd}, srcExtraStartTemp
- bfins srcExtraStartTemp, (dstPixelP){dstExtraStart:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
-
- subq.l Num(1), d2
- bgt @EOE_RowLoop
- // STOP
- bra @Done
-
- @OddEven:
- // START Odd -> Even
- UNROLL(@OE_ColLoop, @OE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @OE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @OE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (srcPixelP){srcExtraStart:0}, dstExtraStartTemp; \
- move.l dstExtraStartTemp, (dstPixelP)+; \
- addq.l Num(4), srcPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OE_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @OE_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
-
- subq.l Num(1), d2
- bgt @OE_RowLoop
- // STOP
- bra @Done
- @OddEvenExtra:
- // START Odd -> Even + Extra
- UNROLL(@OEE_ColLoop, @OEE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @OEE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @OEE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (srcPixelP){srcExtraStart:0}, dstExtraStartTemp; \
- move.l dstExtraStartTemp, (dstPixelP)+; \
- addq.l Num(4), srcPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OEE_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @OEE_ColLoop
- // BLIT EXTRA
- bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, dstExtraStartTemp
- bfins dstExtraStartTemp, (dstPixelP){0:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
-
- subq.l Num(1), d2
- bgt @OEE_RowLoop
- // STOP
- bra @Done
-
- @OddOdd:
- // START Odd -> Odd
- UNROLL(@OO_ColLoop, @OO_ColLoop_End)
-
- move.l rowsToCopy, d2
- @OO_RowLoop:
- move.l d1, d0
- jmp (a0)
- @OO_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (srcPixelP){srcExtraStart:0}, dstExtraEndTemp; \
- bfins dstExtraEndTemp, (dstPixelP){dstExtraStart:0}; \
- addq.l Num(4), srcPixelP; \
- addq.l Num(4), dstPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OO_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @OO_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
-
- subq.l Num(1), d2
- bgt @OO_RowLoop
- // STOP
- bra @Done
- @OddOddExtra:
- // START Odd -> Odd + Extra
- UNROLL(@OOE_ColLoop, @OOE_ColLoop_End)
-
- @OOE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @OOE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (srcPixelP){srcExtraStart:0}, d2; \
- bfins d2, (dstPixelP){dstExtraStart:0}; \
- addq.l Num(4), srcPixelP; \
- addq.l Num(4), dstPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OOE_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @OOE_ColLoop
- // BLIT EXTRA
- bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d2
- bfins d2, (dstPixelP){dstExtraStart:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
-
- subq.l Num(1), rowsToCopy
- bgt @OOE_RowLoop
- // STOP
- bra @Done
-
- @VeryNarrow:
- // START Very Narrow
- move.l rowsToCopy, d2
- @VN_RowLoop:
- // BLIT
- bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d0
- bfins d0, (dstPixelP){dstExtraStart:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
-
- subq.l Num(1), d2
- bgt @VN_RowLoop
- // STOP
-
- @Done:
-
- #if __MWERKS__
- frfree
- #endif
-
- SW_ASM_END
- }
-
- ///--------------------------------------------------------------------------------------
- // BlitPixieAllBitMask
- ///--------------------------------------------------------------------------------------
- SW_ASM_FUNC void BlitPixieAllBitMask(
- register PixelPtr srcPixelP,
- register PixelPtr dstPixelP,
- register PixelPtr maskPixelP,
- unsigned long rowsToCopy,
- unsigned long numBytesPerRow,
- register unsigned long srcRowStride,
- register unsigned long dstRowStride,
- register unsigned long srcExtraStart,
- register unsigned long dstExtraStart,
- register unsigned long dstExtraEnd)
- {
- SW_ASM_BEGIN
-
- #if __MWERKS__
- fralloc +
- #endif
-
- move.l numBytesPerRow, d1
- lsr.l Num(2), d1
- beq @VeryNarrow
-
- tst.l srcExtraStart
- bne @SrcExtraStart
-
- tst.l dstExtraStart
- bne @DstExtraStart
-
- @NoExtraStart:
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @DstExtraStart:
- move.l dstExtraStart, d0
- and.l Num(0x07), d0
- beq @ADstExtraStart
-
- tst.l dstExtraEnd
- beq @EvenOdd
- bra @EvenOddExtra
-
- @ADstExtraStart:
- move.l dstExtraStart, d0
- lsr.l Num(3), d0
- add.l d0, dstPixelP
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @SrcExtraStart:
- tst.l dstExtraStart
- bne @SrcDstExtraStart
- @NoDstExtraStart:
- move.l srcExtraStart, d0
- and.l Num(0x07), d0
- beq @ASrcExtraStart
-
- tst.l dstExtraEnd
- beq @OddEven
- bra @OddEvenExtra
-
- @ASrcExtraStart:
- move.l srcExtraStart, d0
- lsr.l Num(3), d0
- add.l d0, srcPixelP
- add.l d0, maskPixelP
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @SrcDstExtraStart:
- move.l srcExtraStart, d0
- and.l Num(0x07), d0
- beq @ASrcDstExtraStart
- move.l dstExtraStart, d0
- and.l Num(0x07), d0
- beq @ADstSrcExtraStart
-
- tst.l dstExtraEnd
- beq @OddOdd
- bra @OddOddExtra
-
- @ASrcDstExtraStart:
- move.l dstExtraStart, d0
- and.l Num(0x07), d0
- beq @AASrcDstExtraStart
-
- move.l srcExtraStart, d0
- lsr.l Num(3), d0
- add.l d0, srcPixelP
- add.l d0, maskPixelP
- tst.l dstExtraEnd
- beq @EvenOdd
- bra @EvenOddExtra
-
- @ADstSrcExtraStart:
- move.l dstExtraStart, d0
- lsr.l Num(3), d0
- add.l d0, dstPixelP
- tst.l dstExtraEnd
- beq @OddEven
- bra @OddEvenExtra
-
- @AASrcDstExtraStart:
- move.l srcExtraStart, d0
- lsr.l Num(3), d0
- add.l d0, srcPixelP
- add.l d0, maskPixelP
- move.l dstExtraStart, d0
- lsr.l Num(3), d0
- add.l d0, dstPixelP
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @EvenEven:
- // START Even -> Even
- UNROLL(@EE_ColLoop, @EE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EE_ColLoop:
- // BLIT
- #define BLIT \
- move.l (dstPixelP), dstExtraEndTemp; \
- and.l (maskPixelP)+, dstExtraEndTemp; \
- or.l (srcPixelP)+, dstExtraEndTemp; \
- move.l dstExtraEndTemp, (dstPixelP)+;
- REPEAT(BLIT)
- #undef BLIT
- @EE_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @EE_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l Num(1), d2
- bgt @EE_RowLoop
- // STOP
- bra @Done
- @EvenEvenExtra:
- // START Even -> Even + Extra
- UNROLL(@EEE_ColLoop, @EEE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EEE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EEE_ColLoop:
- // BLIT
- #define BLIT \
- move.l (dstPixelP), srcExtraStartTemp; \
- and.l (maskPixelP)+, srcExtraStartTemp; \
- or.l (srcPixelP)+, srcExtraStartTemp; \
- move.l srcExtraStartTemp, (dstPixelP)+;
- REPEAT(BLIT)
- #undef BLIT
- @EEE_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @EEE_ColLoop
- // BLIT EXTRA
- bfextu (dstPixelP){0:dstExtraEnd}, srcExtraStartTemp
- bfextu (maskPixelP){0:dstExtraEnd}, dstExtraStartTemp
- and.l dstExtraStartTemp, srcExtraStartTemp
- bfextu (srcPixelP){0:dstExtraEnd}, dstExtraStartTemp
- or.l dstExtraStartTemp, srcExtraStartTemp
- bfins srcExtraStartTemp, (dstPixelP){0:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l Num(1), d2
- bgt @EEE_RowLoop
- // STOP
- bra @Done
-
- @EvenOdd:
- // START Even -> Odd
- UNROLL(@EO_ColLoop, @EO_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EO_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EO_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (dstPixelP){dstExtraStart:0}, srcExtraStartTemp; \
- and.l (maskPixelP)+, srcExtraStartTemp; \
- or.l (srcPixelP)+, srcExtraStartTemp; \
- bfins srcExtraStartTemp, (dstPixelP){dstExtraStart:0}; \
- addq.l Num(4), dstPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @EO_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @EO_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l Num(1), d2
- bgt @EO_RowLoop
- // STOP
- bra @Done
- @EvenOddExtra:
- // START Even -> Odd + Extra
- UNROLL(@EOE_ColLoop, @EOE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EOE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EOE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (dstPixelP){dstExtraStart:0}, srcExtraStartTemp; \
- and.l (maskPixelP)+, srcExtraStartTemp; \
- or.l (srcPixelP)+, srcExtraStartTemp; \
- bfins srcExtraStartTemp, (dstPixelP){dstExtraStart:0}; \
- addq.l Num(4), dstPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @EOE_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @EOE_ColLoop
- //BLIT EXTRA
- bfextu (dstPixelP){dstExtraStart:dstExtraEnd}, srcExtraStartTemp
- bfextu (maskPixelP){0:dstExtraEnd}, d0
- and.l d0, srcExtraStartTemp
- bfextu (srcPixelP){0:dstExtraEnd}, d0
- or.l d0, srcExtraStartTemp
- bfins srcExtraStartTemp, (dstPixelP){dstExtraStart:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l Num(1), d2
- bgt @EOE_RowLoop
- // STOP
- bra @Done
-
- @OddEven:
- // START Odd -> Even
- UNROLL(@OE_ColLoop, @OE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @OE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @OE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (maskPixelP){srcExtraStart:0}, dstExtraStartTemp; \
- and.l dstExtraStartTemp, (dstPixelP); \
- bfextu (srcPixelP){srcExtraStart:0}, dstExtraStartTemp; \
- or.l dstExtraStartTemp, (dstPixelP)+; \
- addq.l Num(4), srcPixelP; \
- addq.l Num(4), maskPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OE_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @OE_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l Num(1), d2
- bgt @OE_RowLoop
- // STOP
- bra @Done
- @OddEvenExtra:
- // START Odd -> Even + Extra
- UNROLL(@OEE_ColLoop, @OEE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @OEE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @OEE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (maskPixelP){srcExtraStart:0}, dstExtraStartTemp; \
- and.l dstExtraStartTemp, (dstPixelP); \
- bfextu (srcPixelP){srcExtraStart:0}, dstExtraStartTemp; \
- or.l dstExtraStartTemp, (dstPixelP)+; \
- addq.l Num(4), srcPixelP; \
- addq.l Num(4), maskPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OEE_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @OEE_ColLoop
- // BLIT EXTRA
- bfextu (dstPixelP){0:dstExtraEnd}, d0
- bfextu (maskPixelP){srcExtraStart:dstExtraEnd}, dstExtraStartTemp
- and.l dstExtraStartTemp, d0
- bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, dstExtraStartTemp
- or.l dstExtraStartTemp, d0
- bfins d0, (dstPixelP){0:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l Num(1), d2
- bgt @OEE_RowLoop
- // STOP
- bra @Done
-
- @OddOdd:
- // START Odd -> Odd
- UNROLL(@OO_ColLoop, @OO_ColLoop_End)
-
- @OO_RowLoop:
- move.l d1, d0
- jmp (a0)
- @OO_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (dstPixelP){dstExtraStart:0}, dstExtraEndTemp; \
- bfextu (maskPixelP){srcExtraStart:0}, d2; \
- and.l d2, dstExtraEndTemp; \
- bfextu (srcPixelP){srcExtraStart:0}, d2; \
- or.l d2, dstExtraEndTemp; \
- bfins dstExtraEndTemp, (dstPixelP){dstExtraStart:0}; \
- addq.l Num(4), srcPixelP; \
- addq.l Num(4), dstPixelP; \
- addq.l Num(4), maskPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OO_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @OO_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l Num(1), rowsToCopy
- bgt @OO_RowLoop
- // STOP
- bra @Done
- @OddOddExtra:
- // START Odd -> Odd + Extra
- UNROLL(@OOE_ColLoop, @OOE_ColLoop_End)
-
- move.l d1, numBytesPerRow
- @OOE_RowLoop:
- move.l numBytesPerRow, d0
- jmp (a0)
- @OOE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (dstPixelP){dstExtraStart:0}, d1; \
- bfextu (maskPixelP){srcExtraStart:0}, d2; \
- and.l d2, d1; \
- bfextu (srcPixelP){srcExtraStart:0}, d2; \
- or.l d2, d1; \
- bfins d1, (dstPixelP){dstExtraStart:0}; \
- addq.l Num(4), srcPixelP; \
- addq.l Num(4), dstPixelP; \
- addq.l Num(4), maskPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OOE_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @OOE_ColLoop
- // BLIT EXTRA
- bfextu (dstPixelP){dstExtraStart:dstExtraEnd}, d0
- bfextu (maskPixelP){srcExtraStart:dstExtraEnd}, d2
- and.l d2, d0
- bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d2
- or.l d2, d0
- bfins d0, (dstPixelP){dstExtraStart:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l Num(1), rowsToCopy
- bgt @OOE_RowLoop
- // STOP
- bra @Done
-
- @VeryNarrow:
- // START Very Narrow
- move.l rowsToCopy, d2
- @VN_RowLoop:
- // BLIT
- bfextu (dstPixelP){dstExtraStart:dstExtraEnd}, d0
- bfextu (maskPixelP){srcExtraStart:dstExtraEnd}, d1
- and.l d1, d0
- bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d1
- or.l d1, d0
- bfins d0, (dstPixelP){dstExtraStart:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l Num(1), d2
- bgt @VN_RowLoop
- // STOP
-
- @Done:
-
- #if __MWERKS__
- frfree
- #endif
-
- SW_ASM_END
- }
-
- ///--------------------------------------------------------------------------------------
- // BlitPixieAllBitPartialMask
- ///--------------------------------------------------------------------------------------
- SW_ASM_FUNC void BlitPixieAllBitPartialMask(
- register PixelPtr srcPixelP,
- register PixelPtr dstPixelP,
- register PixelPtr maskPixelP,
- unsigned long rowsToCopy,
- unsigned long numBytesPerRow,
- register unsigned long srcRowStride,
- register unsigned long dstRowStride,
- register unsigned long srcExtraStart,
- register unsigned long dstExtraStart,
- register unsigned long dstExtraEnd)
- {
- SW_ASM_BEGIN
-
- #if __MWERKS__
- fralloc +
- #endif
-
- move.l numBytesPerRow, d1
- lsr.l Num(2), d1
- beq @VeryNarrow
-
- tst.l srcExtraStart
- bne @SrcExtraStart
-
- tst.l dstExtraStart
- bne @DstExtraStart
-
- @NoExtraStart:
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @DstExtraStart:
- move.l dstExtraStart, d0
- and.l Num(0x07), d0
- beq @ADstExtraStart
-
- tst.l dstExtraEnd
- beq @EvenOdd
- bra @EvenOddExtra
-
- @ADstExtraStart:
- move.l dstExtraStart, d0
- lsr.l Num(3), d0
- add.l d0, dstPixelP
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @SrcExtraStart:
- tst.l dstExtraStart
- bne @SrcDstExtraStart
- @NoDstExtraStart:
- move.l srcExtraStart, d0
- and.l Num(0x07), d0
- beq @ASrcExtraStart
-
- tst.l dstExtraEnd
- beq @OddEven
- bra @OddEvenExtra
-
- @ASrcExtraStart:
- move.l srcExtraStart, d0
- lsr.l Num(3), d0
- add.l d0, srcPixelP
- add.l d0, maskPixelP
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @SrcDstExtraStart:
- move.l srcExtraStart, d0
- and.l Num(0x07), d0
- beq @ASrcDstExtraStart
- move.l dstExtraStart, d0
- and.l Num(0x07), d0
- beq @ADstSrcExtraStart
-
- tst.l dstExtraEnd
- beq @OddOdd
- bra @OddOddExtra
-
- @ASrcDstExtraStart:
- move.l dstExtraStart, d0
- and.l Num(0x07), d0
- beq @AASrcDstExtraStart
-
- move.l srcExtraStart, d0
- lsr.l Num(3), d0
- add.l d0, srcPixelP
- add.l d0, maskPixelP
- tst.l dstExtraEnd
- beq @EvenOdd
- bra @EvenOddExtra
-
- @ADstSrcExtraStart:
- move.l dstExtraStart, d0
- lsr.l Num(3), d0
- add.l d0, dstPixelP
- tst.l dstExtraEnd
- beq @OddEven
- bra @OddEvenExtra
-
- @AASrcDstExtraStart:
- move.l srcExtraStart, d0
- lsr.l Num(3), d0
- add.l d0, srcPixelP
- add.l d0, maskPixelP
- move.l dstExtraStart, d0
- lsr.l Num(3), d0
- add.l d0, dstPixelP
- tst.l dstExtraEnd
- beq @EvenEven
- bra @EvenEvenExtra
-
- @EvenEven:
- // START Even -> Even
- UNROLL(@EE_ColLoop, @EE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EE_ColLoop:
- // BLIT
- #define BLIT \
- move.l (maskPixelP)+, dstExtraEndTemp; \
- and.l dstExtraEndTemp, (dstPixelP); \
- not.l dstExtraEndTemp; \
- and.l (srcPixelP)+, dstExtraEndTemp; \
- or.l dstExtraEndTemp, (dstPixelP)+;
- REPEAT(BLIT)
- #undef BLIT
- @EE_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @EE_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l Num(1), d2
- bgt @EE_RowLoop
- // STOP
- bra @Done
- @EvenEvenExtra:
- // START Even -> Even + Extra
- UNROLL(@EEE_ColLoop, @EEE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EEE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EEE_ColLoop:
- // BLIT
- #define BLIT \
- move.l (maskPixelP)+, srcExtraStartTemp; \
- and.l srcExtraStartTemp, (dstPixelP); \
- not.l srcExtraStartTemp; \
- and.l (srcPixelP)+, srcExtraStartTemp; \
- or.l srcExtraStartTemp, (dstPixelP)+;
- REPEAT(BLIT)
- #undef BLIT
- @EEE_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @EEE_ColLoop
- // BLIT EXTRA
- bfextu (srcPixelP){0:dstExtraEnd}, d0
- bfextu (dstPixelP){0:dstExtraEnd}, srcExtraStartTemp
- bfextu (maskPixelP){0:dstExtraEnd}, dstExtraStartTemp
- and.l dstExtraStartTemp, srcExtraStartTemp
- not.l dstExtraStartTemp
- and.l dstExtraStartTemp, d0
- or.l srcExtraStartTemp, d0
- bfins d0, (dstPixelP){0:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l Num(1), d2
- bgt @EEE_RowLoop
- // STOP
- bra @Done
-
- @EvenOdd:
- // START Even -> Odd
- UNROLL(@EO_ColLoop, @EO_ColLoop_End)
-
- move.l rowsToCopy, d2
- @EO_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EO_ColLoop:
- // BLIT
- #define BLIT \
- move.l (maskPixelP)+, dstExtraEndTemp; \
- bfextu (dstPixelP){dstExtraStart:0}, srcExtraStartTemp; \
- and.l dstExtraEndTemp, srcExtraStartTemp; \
- not.l dstExtraEndTemp; \
- and.l (srcPixelP)+, dstExtraEndTemp; \
- or.l dstExtraEndTemp, srcExtraStartTemp; \
- bfins srcExtraStartTemp, (dstPixelP){dstExtraStart:0}; \
- addq.l Num(4), dstPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @EO_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @EO_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l Num(1), d2
- bgt @EO_RowLoop
- // STOP
- bra @Done
- @EvenOddExtra:
- // START Even -> Odd + Extra
- UNROLL(@EOE_ColLoop, @EOE_ColLoop_End)
-
- // move.l rowsToCopy, d2
- @EOE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @EOE_ColLoop:
- // BLIT
- #define BLIT \
- move.l (maskPixelP)+, d2; \
- bfextu (dstPixelP){dstExtraStart:0}, srcExtraStartTemp; \
- and.l d2, srcExtraStartTemp; \
- not.l d2; \
- and.l (srcPixelP)+, d2; \
- or.l d2, srcExtraStartTemp; \
- bfins srcExtraStartTemp, (dstPixelP){dstExtraStart:0}; \
- addq.l Num(4), dstPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @EOE_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @EOE_ColLoop
- //BLIT EXTRA
- bfextu (srcPixelP){0:dstExtraEnd}, d0
- bfextu (dstPixelP){dstExtraStart:dstExtraEnd}, srcExtraStartTemp
- bfextu (maskPixelP){0:dstExtraEnd}, d2
- and.l d2, srcExtraStartTemp
- not.l d2
- and.l d2, d0
- or.l srcExtraStartTemp, d0
- bfins d0, (dstPixelP){dstExtraStart:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l Num(1), rowsToCopy
- bgt @EOE_RowLoop
- // STOP
- bra @Done
-
- @OddEven:
- // START Odd -> Even
- UNROLL(@OE_ColLoop, @OE_ColLoop_End)
-
- move.l rowsToCopy, d2
- @OE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @OE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (srcPixelP){srcExtraStart:0}, dstExtraStartTemp; \
- bfextu (maskPixelP){srcExtraStart:0}, dstExtraEndTemp; \
- and.l dstExtraEndTemp, (dstPixelP); \
- not.l dstExtraEndTemp; \
- and.l dstExtraEndTemp, dstExtraStartTemp; \
- or.l dstExtraStartTemp, (dstPixelP)+; \
- addq.l Num(4), srcPixelP; \
- addq.l Num(4), maskPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OE_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @OE_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l Num(1), d2
- bgt @OE_RowLoop
- // STOP
- bra @Done
- @OddEvenExtra:
- // START Odd -> Even + Extra
- UNROLL(@OEE_ColLoop, @OEE_ColLoop_End)
-
- @OEE_RowLoop:
- move.l d1, d0
- jmp (a0)
- @OEE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (srcPixelP){srcExtraStart:0}, dstExtraStartTemp; \
- bfextu (maskPixelP){srcExtraStart:0}, d2; \
- and.l d2, (dstPixelP); \
- not.l d2; \
- and.l d2, dstExtraStartTemp; \
- or.l dstExtraStartTemp, (dstPixelP)+; \
- addq.l Num(4), srcPixelP; \
- addq.l Num(4), maskPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OEE_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @OEE_ColLoop
- // BLIT EXTRA
- bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d0
- bfextu (dstPixelP){0:dstExtraEnd}, dstExtraStartTemp
- bfextu (maskPixelP){srcExtraStart:dstExtraEnd}, d2
- and.l d2, dstExtraStartTemp
- not.l d2
- and.l d2, d0
- or.l dstExtraStartTemp, d0
- bfins d0, (dstPixelP){0:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l Num(1), rowsToCopy
- bgt @OEE_RowLoop
- // STOP
- bra @Done
-
- @OddOdd:
- // START Odd -> Odd
- UNROLL(@OO_ColLoop, @OO_ColLoop_End)
-
- move.l d1, numBytesPerRow
- @OO_RowLoop:
- move.l numBytesPerRow, d0
- jmp (a0)
- @OO_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (srcPixelP){srcExtraStart:0}, d1; \
- bfextu (dstPixelP){dstExtraStart:0}, dstExtraEndTemp; \
- bfextu (maskPixelP){srcExtraStart:0}, d2; \
- and.l d2, dstExtraEndTemp; \
- not.l d2; \
- and.l d2, d1; \
- or.l dstExtraEndTemp, d1; \
- bfins d1, (dstPixelP){dstExtraStart:0}; \
- addq.l Num(4), srcPixelP; \
- addq.l Num(4), dstPixelP; \
- addq.l Num(4), maskPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OO_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @OO_ColLoop
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l Num(1), rowsToCopy
- bgt @OO_RowLoop
- // STOP
- bra @Done
- @OddOddExtra:
- // START Odd -> Odd + Extra
- UNROLL(@OOE_ColLoop, @OOE_ColLoop_End)
-
- move.l d1, numBytesPerRow
- move.l dstRowStride, -(sp)
- @OOE_RowLoop:
- move.l numBytesPerRow, d0
- jmp (a0)
- @OOE_ColLoop:
- // BLIT
- #define BLIT \
- bfextu (srcPixelP){srcExtraStart:0}, dstRowStrideTemp; \
- bfextu (dstPixelP){dstExtraStart:0}, d1; \
- bfextu (maskPixelP){srcExtraStart:0}, d2; \
- and.l d2, d1; \
- not.l d2; \
- and.l d2, dstRowStrideTemp; \
- or.l d1, dstRowStrideTemp; \
- bfins dstRowStrideTemp, (dstPixelP){dstExtraStart:0}; \
- addq.l Num(4), srcPixelP; \
- addq.l Num(4), dstPixelP; \
- addq.l Num(4), maskPixelP;
- REPEAT(BLIT)
- #undef BLIT
- @OOE_ColLoop_End:
-
- subq.l Num(1), d0
- bpl @OOE_ColLoop
- // BLIT EXTRA
- bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d0
- bfextu (dstPixelP){dstExtraStart:dstExtraEnd}, d1
- bfextu (maskPixelP){srcExtraStart:dstExtraEnd}, d2
- and.l d2, d1
- not.l d2
- and.l d2, d0
- or.l d1, d0
- bfins d0, (dstPixelP){dstExtraStart:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l (sp), dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l Num(1), rowsToCopy
- bgt @OOE_RowLoop
-
- addq.l Num(4), sp
- // STOP
- bra @Done
-
- @VeryNarrow:
- // START Very Narrow
- @VN_RowLoop:
- // BLIT
- bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d0
- bfextu (dstPixelP){dstExtraStart:dstExtraEnd}, d1
- bfextu (maskPixelP){srcExtraStart:dstExtraEnd}, d2
- and.l d2, d1
- not.l d2
- and.l d2, d0
- or.l d1, d0
- bfins d0, (dstPixelP){dstExtraStart:dstExtraEnd}
-
- adda.l srcRowStride, srcPixelP
- adda.l dstRowStride, dstPixelP
- adda.l srcRowStride, maskPixelP
-
- subq.l Num(1), rowsToCopy
- bgt @VN_RowLoop
- // STOP
-
- @Done:
-
- #if __MWERKS__
- frfree
- #endif
-
- SW_ASM_END
- }
-
- #endif /* #if SW_PPC */